package com.alan.singleton;

/**
 * Created by Alan on 2018/8/20.
 *
 *  双重检查加锁
 */
public class DoubleCheckedLockingSingleton {

    // volatile 关键字的作用请参考JVM，用于保证变量可见性，作用是当前线程修改后会立即同步到主存区而不是线程缓存区，
    // 其他线程也直接从主存区获取变量值。会稍微减低性能
    private volatile static DoubleCheckedLockingSingleton instance;

    private DoubleCheckedLockingSingleton(){}

    public static DoubleCheckedLockingSingleton getInstance(){
        //保证同步代码不会被多次执行，因为synchronized会降低近100倍性能
        if(null == instance){
            synchronized (DoubleCheckedLockingSingleton.class){
                //有可能会被多个线程进入创建多个示例
                if(instance == null){
                    instance = new DoubleCheckedLockingSingleton();
                }
            }
        }
        return instance;
    }
}
